"""
@Author  : 康帅
@Time    : 2021/5/21 17:58
@Function: 
"""

import socketio


# 1.创建客户端实例
sio = socketio.Client(logger=True, engineio_logger=True)


# 2.定义事件处理程序:事件名称 参数列表
@sio.event
def message(data):
    """ 事件名称是从处理函数的名称获得的 """
    print('接收到消息')


@sio.on('my message')
def on_message(data):
    """ 它允许事件名称不同于函数名称，或包含函数名称中非法的字符 """
    print('接收到消息')


@sio.event
async def message(data):
    """ 对于asyncio客户端，事件处理程序可以是上面的常规函数​​，也可以是协程 """
    print('接收到消息')


# 该连接对应4.1
@sio.event(namespace='/chat')
def my_custom_event(sid, data):
    pass


@sio.on('connect', namespace='/chat')
def on_connect():
    print("我已连接到/chat名称空间")


# 3.connect_error而disconnect事件是特殊的
# 当客户端连接或断开与服务器的连接时，它们会自动被调用
@sio.event
def connect():
    print("连接成功")


@sio.event
def connect_error(data):
    print("连接失败")


@sio.event
def disconnect():
    print("断开连接")


# 4.连接到服务器
sio.connect('http://localhost:5000')
# 4.1命名空间连接
sio.connect('http://localhost:5000', namespaces=['/chat'])

# 5.连接成功后服务器会为客户端分配一个唯一的会话标识
print('my sid is', sio.sid)

# 6.发出事件
sio.emit('my message', {"foo": "bar"})
# 该发送事件对应4.1
sio.emit('my message', {"foo": "bar"}, namespace='/chat')

# 7.与服务器断开连接
sio.disconnect()


class MyCustomNamespace(socketio.ClientNamespace):
    """ 基于类的命名空间 """

    def on_connect(self):
        pass

    def on_disconnect(self):
        pass

    def on_my_event(self, data):
        self.emit('my message', data)


sio.register_namespace(MyCustomNamespace('/chat'))
